home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / gnuish / ginf / rcs.doc < prev    next >
Text File  |  1993-09-30  |  62KB  |  1,756 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.              RCS--A System for Version Control
  11.  
  12.  
  13.  
  14.                       Walter F. Tichy
  15.  
  16.               Department of Computer Sciences
  17.                      Purdue University
  18.                West Lafayette, Indiana 47907
  19.  
  20.  
  21.  
  22.  
  23.                           ABSTRACT
  24.  
  25.           An important problem in  program  development
  26.      and maintenance is version control, i.e., the task
  27.      of keeping a software system  consisting  of  many
  28.      versions  and  configurations well organized.  The
  29.      Revision Control System (RCS) is a  software  tool
  30.      that  assists  with  that task.  RCS manages revi-
  31.      sions of text documents, in particular source pro-
  32.      grams, documentation, and test data.  It automates
  33.      the storing, retrieval, logging and identification
  34.      of revisions, and it provides selection mechanisms
  35.      for composing configurations.  This  paper  intro-
  36.      duces basic version control concepts and discusses
  37.      the practice of version control  using  RCS.   For
  38.      conserving space, RCS stores deltas, i.e., differ-
  39.      ences between successive revisions.  Several delta
  40.      storage  methods  are discussed.  Usage statistics
  41.      show that RCS's delta storage method is space  and
  42.      time   efficient.   The  paper  concludes  with  a
  43.      detailed survey of version control tools.
  44.  
  45.      Keywords:   configuration   management,    history
  46.      management, version control, revisions, deltas.
  47.  
  48.  
  49.  
  50. 1991/01/03
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.              RCS--A System for Version Control
  77.  
  78.  
  79.  
  80.                       Walter F. Tichy
  81.  
  82.               Department of Computer Sciences
  83.                      Purdue University
  84.                West Lafayette, Indiana 47907
  85.  
  86.  
  87.  
  88.  
  89.  
  90. 1.  Introduction
  91.  
  92.      Version control is the task of keeping software systems
  93. consisting  of  many versions and configurations well organ-
  94. ized.  The Revision Control System (RCS) is a  set  of  UNIX
  95. commands that assist with that task.
  96.  
  97.      RCS' primary function is to manage revision groups.   A
  98. revision group is a set of text documents, called revisions,
  99. that evolved from each other.  A new revision is created  by
  100. manually  editing  an existing one.  RCS organizes the revi-
  101. sions into an ancestral tree.  The initial revision  is  the
  102. root  of  the  tree,  and the tree edges indicate from which
  103. revision a given one evolved.  Besides  managing  individual
  104. revision  groups,  RCS provides flexible selection functions
  105. for composing configurations.   RCS  may  be  combined  with
  106. MAKE1, resulting in a powerful package for version control.
  107.  
  108.      RCS also offers facilities  for  merging  updates  with
  109. customer  modifications,  for  distributed software develop-
  110. ment, and for automatic identification.   Identification  is
  111. the  `stamping'  of revisions and configurations with unique
  112. _________________________
  113. An earlier version  of  this  paper  was  published  in
  114. Software--Practice  &  Experience  15,  7  (July 1985),
  115. 637-654.
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.                            - 2 -
  126.  
  127. markers.  These markers are akin to serial numbers,  telling
  128. software  maintainers  unambiguously  which configuration is
  129. before them.
  130.  
  131.      RCS is designed for both  production  and  experimental
  132. environments.   In  production environments, access controls
  133. detect update conflicts and prevent overlapping changes.  In
  134. experimental  environments,  where strong controls are coun-
  135. terproductive, it is possible to loosen the controls.
  136.  
  137.      Although RCS was originally intended for  programs,  it
  138. is  useful for any text that is revised frequently and whose
  139. previous revisions must be preserved.  RCS has been  applied
  140. successfully  to  store  the  source text for drawings, VLSI
  141. layouts,  documentation,  specifications,  test  data,  form
  142. letters and articles.
  143.  
  144.      This paper discusses the practice  of  version  control
  145. using  RCS.   It  also introduces basic version control con-
  146. cepts, useful for clarifying current practice and  designing
  147. similar  systems.   Revision groups of individual components
  148. are treated in the next three sections, and  the  extensions
  149. to  configurations follow.  Because of its size, a survey of
  150. version control tools appears at the end of the paper.
  151.  
  152. 2.  Getting started with RCS
  153.  
  154.      Suppose a text file f.c is to be placed  under  control
  155. of RCS.  Invoking the check-in command
  156.  
  157.         ci  f.c
  158.  
  159. creates a new revision group with the contents of f.c as the
  160. initial  revision  (numbered  1.1) and stores the group into
  161. the file f.c,v.  Unless told otherwise, the command  deletes
  162. f.c.   It  also  asks  for  a description of the group.  The
  163. description should state the common purpose of all revisions
  164. in the group, and becomes part of the group's documentation.
  165. All later check-in commands will ask for a log entry,  which
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.                            - 3 -
  174.  
  175. should  summarize  the changes made.  (The first revision is
  176. assigned a default log message, which just records the  fact
  177. that it is the initial revision.)
  178.  
  179.      Files ending in ,v are called RCS files (v  stands  for
  180. versions); the others are called working files.  To get back
  181. the working file f.c in the previous  example,  execute  the
  182. check-out command:
  183.  
  184.         co  f.c
  185.  
  186. This command extracts the latest revision from the  revision
  187. group f.c,v and writes it into f.c.  The file f.c can now be
  188. edited and, when finished, checked back in with ci:
  189.  
  190.         ci  f.c
  191.  
  192. Ci assigns number 1.2 to the new revision.  If ci  complains
  193. with the message
  194.  
  195.         ci error: no lock set by <login>
  196.  
  197. then the system administrator has decided to  configure  RCS
  198. for a production environment by enabling the `strict locking
  199. feature'.  If this feature is enabled,  all  RCS  files  are
  200. initialized  such that check-in operations require a lock on
  201. the previous revision (the one from which  the  current  one
  202. evolved).   Locking  prevents  overlapping  modifications if
  203. several people  work  on  the  same  file.   If  locking  is
  204. required,  the  revision  should have been locked during the
  205. check-out by using the option -l:
  206.  
  207.         co  -l  f.c
  208.  
  209. Of course it is too late now for the check-out with locking,
  210. because  f.c has already been changed; checking out the file
  211. again  would  overwrite  the  modifications.   (To   prevent
  212. accidental  overwrites,  co senses the presence of a working
  213. file and asks whether the user really intended to  overwrite
  214. it.  The overwriting check-out is sometimes useful for back-
  215. ing up to the previous revision.) To be able to proceed with
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.                            - 4 -
  224.  
  225. the check-in in the present case, first execute
  226.  
  227.         rcs  -l  f.c
  228.  
  229. This command retroactively locks the latest revision, unless
  230. someone  else  locked it in the meantime.  In this case, the
  231. two programmers involved have to negotiate  whose  modifica-
  232. tions should take precedence.
  233.  
  234.      If an RCS file is private, i.e., if only the  owner  of
  235. the  file  is  expected  to  deposit  revisions into it, the
  236. strict locking feature is unnecessary and may  be  disabled.
  237. If  strict  locking  is  disabled, the owner of the RCS file
  238. need not have a lock for check-in.  For safety reasons,  all
  239. others  still do.  Turning strict locking off and on is done
  240. with the commands:
  241.  
  242.         rcs  -U  f.c       and         rcs  -L  f.c
  243.  
  244. These commands enable or disable the strict locking  feature
  245. for  each  RCS  file individually.  The system administrator
  246. only decides whether strict locking is enabled initially.
  247.  
  248.      To reduce the clutter in a working directory,  all  RCS
  249. files can be moved to a subdirectory with the name RCS.  RCS
  250. commands look first into that directory for RCS files.   All
  251. the  commands presented above work with the RCS subdirectory
  252. without change.
  253.  
  254.      It may be undesirable that ci deletes the working file.
  255. For  instance,  sometimes one would like to save the current
  256. revision, but continue editing.  Invoking
  257.  
  258.         ci  -l  f.c
  259. _________________________
  260.    Pairs of RCS and  working  files  can  actually  be
  261. specified  in  3  ways:  a) both are given, b) only the
  262. working file is given, c) only the RCS file  is  given.
  263. If  a pair is given, both files may have arbitrary path
  264. prefixes; RCS commands pair them up intelligently.
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.                            - 5 -
  275.  
  276. checks in f.c as usual, but performs an additional check-out
  277. with  locking  afterwards.   Thus, the working file does not
  278. disappear after the check-in.  Similarly, the option -u does
  279. a  check-in  followed  by a check-out without locking.  This
  280. option is useful if the file is needed for compilation after
  281. the  check-in.  Both options update the identification mark-
  282. ers in the working file (see below).
  283.  
  284.      Besides the operations ci and co, RCS provides the fol-
  285. lowing commands:
  286.  
  287. ident       extract identification markers
  288. rcs         change RCS file attributes
  289. rcsclean    remove unchanged working files (optional)
  290. rcsdiff     compare revisions
  291. rcsfreeze   record a configuration (optional)
  292. rcsmerge    merge revisions
  293. rlog        read log messages and other information in RCS files
  294.  
  295. A synopsis of these commands appears in the Appendix.
  296.  
  297. 2.1.  Automatic Identification
  298.  
  299.      RCS can stamp source and object code with special iden-
  300. tification  strings,  similar to product and serial numbers.
  301. To obtain such identification, place the marker
  302.  
  303.         $Id$
  304.  
  305. into the text of a revision, for instance inside a  comment.
  306. The  check-out  operation  will  replace  this marker with a
  307. string of the form
  308.  
  309.         $Id:  filename  revisionnumber  date  time  author  state  locker $
  310.  
  311. This string need never be touched, because co keeps it up to
  312. date  automatically.   To  propagate  the marker into object
  313. code, simply put it into a literal character string.  In  C,
  314. this is done as follows:
  315.  
  316.         static char rcsid[] = "$Id$";
  317.  
  318. The command ident extracts such markers from  any  file,  in
  319. particular  from object code.  Ident helps to find out which
  320. revisions of which modules were used in a given program.  It
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.                            - 6 -
  329.  
  330. returns  a  complete  and  unambiguous  component list, from
  331. which a copy of the  program  can  be  reconstructed.   This
  332. facility is invaluable for program maintenance.
  333.  
  334.      There are several  additional  identification  markers,
  335. one for each component of $Id$.  The marker
  336.  
  337.         $Log$
  338.  
  339. has a similar function.  It  accumulates  the  log  messages
  340. that  are requested during check-in.  Thus, one can maintain
  341. the complete history of a revision directly  inside  it,  by
  342. enclosing  it in a comment.  Figure 1 is a partial reproduc-
  343. tion of a log contained in revision 4.1 of  the  file  ci.c.
  344. The  log  appears at the beginning of the file, and makes it
  345. easy to determine what the recent modifications were.
  346.  
  347.      /* $Log: ci.c,v $
  348.       * Revision 4.1  1983/05/10  17:03:06  wft
  349.       * Added option -d and -w, and updated assignment of date, etc. to new delta.
  350.       * Added handling of default branches.
  351.       *
  352.       * Revision 3.9  1983/02/15  15:25:44  wft
  353.       * Added call to fastcopy() to copy remainder of RCS file.
  354.       *
  355.       * Revision 3.8  1983/01/14  15:34:05  wft
  356.       * Added ignoring of interrupts while new RCS file is renamed;
  357.       * avoids deletion of RCS files by interrupts.
  358.       *
  359.       * Revision 3.7  1982/12/10  16:09:20  wft
  360.       * Corrected checking of return code from diff.
  361.       * An RCS file now inherits its mode during the first ci from the working file,
  362.       * except that write permission is removed.
  363.       */
  364.     Figure 1.  Log entries produced by the marker $Log$.
  365.  
  366. Since revisions are stored in the form of differences,  each
  367. log  message  is  physically stored once, independent of the
  368. number of revisions present.  Thus, the $Log$ marker  incurs
  369. negligible space overhead.
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.                            - 7 -
  384.  
  385. 3.  The RCS Revision Tree
  386.  
  387.      RCS arranges revisions in an ancestral  tree.   The  ci
  388. command  builds  this tree; the auxiliary command rcs prunes
  389. it.  The tree has a root revision,  normally  numbered  1.1,
  390. and  successive  revisions  are numbered 1.2, 1.3, etc.  The
  391. first field of a  revision  number  is  called  the  release
  392. number  and  the  second one the level number.  Unless given
  393. explicitly, the ci command assigns a new revision number  by
  394. incrementing the level number of the previous revision.  The
  395. release number must be incremented explicitly, using the  -r
  396. option  of  ci.   Assuming there are revisions 1.1, 1.2, and
  397. 1.3 in the RCS file f.c,v, the command
  398.  
  399.         ci  -r2.1  f.c       or       ci  -r2  f.c
  400.  
  401. assigns the number 2.1 to the new revision.  Later check-ins
  402. without  the -r option will assign the numbers 2.2, 2.3, and
  403. so on.  The release number should  be  incremented  only  at
  404. major  transition  points  in  the development, for instance
  405. when a new release of a software product has been completed.
  406.  
  407. 3.1.  When are branches needed?
  408.  
  409.      A young revision tree is slender: It consists  of  only
  410. one  branch,  called  the  trunk.   As  the  tree ages, side
  411. branches may form.  Branches are needed in the  following  4
  412. situations.
  413.  
  414. Temporary fixes
  415.      Suppose a tree has 5 revisions grouped in  2  releases,
  416.      as illustrated in Figure 2.  Revision 1.3, the last one
  417.      of release 1, is in operation at customer sites,  while
  418.      release 2 is in active development.
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.                            - 8 -
  434.  
  435.      box "1.1" arrow box "1.2" arrow  box  "1.3"  arrow  box
  436.      "2.1" arrow box "2.2" arrow dashed
  437.                Figure 2.  A slender revision tree.
  438.      Now imagine a customer requesting a fix of a problem in
  439.      revision  1.3, although actual development has moved on
  440.      to release 2.  RCS does not permit an extra revision to
  441.      be spliced in between 1.3 and 2.1, since that would not
  442.      reflect  the  actual  development  history.    Instead,
  443.      create  a  branch at revision 1.3, and check in the fix
  444.      on that branch.  The first branch starting at  1.3  has
  445.      number 1.3.1, and the revisions on that branch are num-
  446.      bered 1.3.1.1, 1.3.1.2, etc.  The double  numbering  is
  447.      needed  to  allow for another branch at 1.3, say 1.3.2.
  448.      Revisions  on  the  second  branch  would  be  numbered
  449.      1.3.2.1,  1.3.2.2,  and  so  on.   The  following steps
  450.      create branch 1.3.1 and add revision 1.3.1.1:
  451.  
  452.              co  -r1.3  f.c      -- check out revision 1.3
  453.              edit  f.c           -- change it
  454.              ci  -r1.3.1  f.c    -- check it in on branch 1.3.1
  455.  
  456.      This sequence of commands transforms the tree of Figure
  457.      2 into the one in Figure 3.  Note that it may be neces-
  458.      sary to incorporate the  differences  between  1.3  and
  459.      1.3.1.1  into  a  revision  at  level 2.  The operation
  460.      rcsmerge automates this process (see the Appendix).
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.                            - 9 -
  487.  
  488.           box "1.1"
  489.           arrow
  490.           box "1.2"
  491.           arrow R13: box "1.3"
  492.           arrow R21: box "2.1"
  493.           arrow R22: box "2.2"
  494.           arrow dashed
  495.           line invis down from R21.s RB1: box "1.3.1.1"
  496.           arrow dashed right from RB1.e
  497.           arrow from R13.s to RB1.w
  498.          Figure 3.  A revision tree with one side branch
  499.  
  500.  
  501. Distributed development and customer modifications
  502.      Assume a situation as in Figure 2, where  revision  1.3
  503.      is  in  operation  at  several  customer  sites,  while
  504.      release 2 is in development.  Customer sites should use
  505.      RCS to store the distributed software.  However, custo-
  506.      mer modifications should not  be  placed  on  the  same
  507.      branch  as the distributed source; instead, they should
  508.      be placed on a side branch.   When  the  next  software
  509.      distribution  arrives,  it  should  be  appended to the
  510.      trunk of the customer's RCS file, and the customer  can
  511.      then  merge  the  local modifications back into the new
  512.      release.  In the above example, a customer's  RCS  file
  513.      would  contain  the  following  tree, assuming that the
  514.      customer has received revision  1.3,  added  his  local
  515.      modifications  as revision 1.3.1.1, then received revi-
  516.      sion 2.4, and merged  2.4  and  1.3.1.1,  resulting  in
  517.      2.4.1.1.
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.                            - 10 -
  536.  
  537.      R13: box "1.3"
  538.           line invis R21: box invis
  539.           line invis R22: box invis
  540.           line invis R24: box "2.4"
  541.           line invis R25: box invis
  542.           line invis
  543.           arrow from R13.e to R24.w
  544.           line invis down from R21.s RB1: box "1.3.1.1"
  545.           arrow from R13.s to RB1.w
  546.           right
  547.           line invis down from R25.s RB2: box "2.4.1.1"
  548.           arrow from R24.s to RB2.w
  549.      Figure 4.  A customer's revision tree with local modifications.
  550.  
  551.      This approach is actually practiced in the  CSNET  pro-
  552.      ject,   where   several   universities  and  a  company
  553.      cooperate in developing a national computer network.
  554.  
  555. Parallel development
  556.      Sometimes it  is  desirable  to  explore  an  alternate
  557.      design  or  a  different  implementation  technique  in
  558.      parallel with the main line development.  Such develop-
  559.      ment  should  be  carried  out  on  a side branch.  The
  560.      experimental changes may later be moved into  the  main
  561.      line, or abandoned.
  562.  
  563. Conflicting updates
  564.      A common occurrence is that one programmer has  checked
  565.      out  a revision, but cannot complete the assignment for
  566.      some reason.  In the meantime, another person must per-
  567.      form  another  modification immediately.  In that case,
  568.      the second person should check-out the  same  revision,
  569.      modify  it, and check it in on a side branch, for later
  570.      merging.
  571.  
  572.      Every node in a revision tree consists of the following
  573. attributes: a revision number, a check-in date and time, the
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.                            - 11 -
  583.  
  584. author's identification, a log entry, a state and the actual
  585. text.   All  these attributes are determined at the time the
  586. revision is checked in.  The state attribute  indicates  the
  587. status  of  a revision.  It is set automatically to `experi-
  588. mental' during check-in.  A revision can later  be  promoted
  589. to a higher status, for example `stable' or `released'.  The
  590. set of states is user-defined.
  591.  
  592. 3.2.  Revisions are represented as deltas
  593.  
  594.      For conserving space, RCS stores revisions in the  form
  595. of deltas, i.e., as differences between revisions.  The user
  596. interface completely hides this fact.
  597.  
  598.      A delta is a sequence of edit commands that  transforms
  599. one  string  into  another.   The deltas employed by RCS are
  600. line-based, which means that the only edit commands  allowed
  601. are  insertion and deletion of lines.  If a single character
  602. in a line is changed, the edit scripts consider  the  entire
  603. line  changed.   The  program  diff2 produces a small, line-
  604. based delta between pairs of text files.  A  character-based
  605. edit script would take much longer to compute, and would not
  606. be significantly shorter.
  607.  
  608.      Using deltas is a classical space-time tradeoff: deltas
  609. reduce  the  space consumed, but increase access time.  How-
  610. ever, a version control tool should impose as  little  delay
  611. as possible on programmers.  Excessive delays discourage the
  612. use of version  controls,  or  induce  programmers  to  take
  613. shortcuts that compromise system integrity.  To gain reason-
  614. ably fast access time for both editing  and  compiling,  RCS
  615. arranges deltas in the following way.  The most recent revi-
  616. sion on the trunk is stored intact.  All other revisions  on
  617. the  trunk  are  stored  as reverse deltas.  A reverse delta
  618. describes how to go backward in the development history:  it
  619. produces the desired revision if applied to the successor of
  620. that revision.  This implementation has the  advantage  that
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.                            - 12 -
  630.  
  631. extraction  of the latest revision is a simple and fast copy
  632. operation.  Adding a new revision to the trunk is also fast:
  633. ci  simply adds the new revision intact, replaces the previ-
  634. ous revision with a reverse delta, and keeps the rest of the
  635. old  deltas.   Thus, ci requires the computation of only one
  636. new delta.
  637.  
  638.      Branches need special treatment.   The  naive  solution
  639. would  be  to  store  complete  copies  for  the tips of all
  640. branches.  Clearly, this approach would cost too much space.
  641. Instead, RCS uses forward deltas for branches.  Regenerating
  642. a revision on a side branch  proceeds  as  follows.   First,
  643. extract  the  latest  revision on the trunk; secondly, apply
  644. reverse deltas until the fork revision  for  the  branch  is
  645. obtained;  thirdly,  apply  forward deltas until the desired
  646. branch revision is reached.  Figure  5  illustrates  a  tree
  647. with  one  side  branch.  Triangles pointing to the left and
  648. right represent reverse and forward deltas, respectively.
  649. define BD X [line invis $1 right .5; line up .3 then left .5
  650. down .3 then right .5 down .3 then up .3] X
  651.  
  652. define FD X [line invis $1 right .5; line left  .5  down  .3
  653. then up .6 then right .5 down .3;] X
  654.  
  655. right D11:    BD(" 1.1")         arrow right from D11.e D12:
  656. BD("  1.2")          arrow   right  from  D12.e D13:    BD("
  657. 1.3")         arrow  right from  D13.e  D21:     BD("  2.1")
  658.         arrow    right   from   D21.e   D22:      box  "2.2"
  659.         line invis down from D21.s  F1:      FD("1.3.1.1  ")
  660.         arrow  from  D13.se  to F1.w         arrow from F1.e
  661. right         right F2:     FD("1.3.1.2 ")
  662. Figure 5.  A revision tree with reverse and forward deltas.
  663.  
  664.      Although implementing fast  check-out  for  the  latest
  665. trunk  revision,  this arrangement has the disadvantage that
  666. generation of other revisions takes time proportional to the
  667. number  of  deltas  applied.   For example, regenerating the
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.                            - 13 -
  676.  
  677. branch tip in Figure 5 requires application of  five  deltas
  678. (including  the  initial  one).  Since usage statistics show
  679. that the latest trunk revision is the one that is  retrieved
  680. in  95  per  cent  of  all  cases  (see the section on usage
  681. statistics), biasing check-out time in favor of  that  revi-
  682. sion  results  in  significant  savings.   However,  careful
  683. implementation of the delta application process is necessary
  684. to  provide  low  retrieval overhead for other revisions, in
  685. particular for branch tips.
  686.  
  687.      There are several  techniques  for  delta  application.
  688. The  naive  one  is  to pass each delta to a general-purpose
  689. text editor.  A prototype of RCS invoked the UNIX editor  ed
  690. both  for  applying deltas and for expanding the identifica-
  691. tion markers.  Although easy to implement,  performance  was
  692. poor, owing to the high start-up costs and excess generality
  693. of ed.  An intermediate  version  of  RCS  used  a  special-
  694. purpose, stream-oriented editor.  This technique reduced the
  695. cost of applying a delta to the cost  of  checking  out  the
  696. latest trunk revision.  The reason for this behavior is that
  697. each delta application involves a  complete  pass  over  the
  698. preceding revision.
  699.  
  700.      However, there is a much better algorithm.   Note  that
  701. the  deltas are line oriented and that most of the work of a
  702. stream editor involves  copying  unchanged  lines  from  one
  703. revision to the next.  A faster algorithm avoids unnecessary
  704. copying of character strings by  using  a  piece  table.   A
  705. piece  table  is  a  one-dimensional array, specifying how a
  706. given revision is `pieced together' from lines  in  the  RCS
  707. file.   Suppose piece table PTr represents revision r.  Then
  708. PTr[i] contains the starting position of line i of  revision
  709. r.  Application of the next delta transforms piece table PTr
  710. into PTr+1.  For instance, a delete command removes a series
  711. of  entries  from  the  piece  table.   An insertion command
  712. inserts new entries, moving the entries following the inser-
  713. tion  point  further  down  the array.  The inserted entries
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.                            - 14 -
  722.  
  723. point to the text lines in  the  delta.   Thus,  no  I/O  is
  724. involved except for reading the delta itself.  When all del-
  725. tas have been applied to the piece table, a sequential  pass
  726. through  the  table  looks  up each line in the RCS file and
  727. copies it to the output file, updating identification  mark-
  728. ers  at  the same time.  Of course, the RCS file must permit
  729. random  access,  since  the  copied  lines   are   scattered
  730. throughout that file.  Figure 6 illustrates an RCS file with
  731. two revisions and the corresponding piece tables.
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.                  Figure 6 is not available.
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.         Figure 6.  An RCS file and its piece tables
  750.  
  751.      The piece table approach has the property that the time
  752. for  applying  a  single  delta is roughly determined by the
  753. size of the delta, and not by the size of the revision.  For
  754. example,  if  a  delta is 10 per cent of the size of a revi-
  755. sion, then applying it takes only 10 per cent of the time to
  756. generate  the  latest  trunk  revision.   (The stream editor
  757. would take 100 per cent.)
  758.  
  759.      There is an important alternative for representing del-
  760. tas  that  affects  performance.  SCCS3, a precursor of RCS,
  761. uses interleaved deltas.  A file containing interleaved del-
  762. tas  is  partitioned into blocks of lines.  Each block has a
  763. header  that  specifies  to  which  revision(s)  the   block
  764. belongs.   The  blocks  are  sorted out in such a way that a
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.                            - 15 -
  773.  
  774. single pass over the file can pick up all the lines  belong-
  775. ing  to  a  given revision.  Thus, the regeneration time for
  776. all revisions is the same: all headers  must  be  inspected,
  777. and  the associated blocks either copied or skipped.  As the
  778. number of revisions increases, the cost  of  retrieving  any
  779. revision  is  much  higher than the cost of checking out the
  780. latest trunk revision with reverse deltas.  A detailed  com-
  781. parison  of SCCS's interleaved deltas and RCS's reverse del-
  782. tas can be found in Reference 4.  This  reference  considers
  783. the  version  of RCS with the stream editor only.  The piece
  784. table method improves performance further, so  that  RCS  is
  785. always  faster  than  SCCS,  except if 10 or more deltas are
  786. applied.
  787.  
  788.      Additional speed-up  for  both  delta  methods  can  be
  789. obtained by caching the most recently generated revision, as
  790. has been implemented in DSEE.5 With caching, access time  to
  791. frequently  used  revisions  can approach normal file access
  792. time, at the cost of some additional space.
  793.  
  794. 4.  Locking: A Controversial Issue
  795.  
  796.      The locking mechanism for RCS was difficult to  design.
  797. The  problem  and  its solution are first presented in their
  798. `pure' form, followed by a discussion of  the  complications
  799. caused by `real-world' considerations.
  800.  
  801.      RCS must prevent two or more  persons  from  depositing
  802. competing  changes  of  the same revision.  Suppose two pro-
  803. grammers check out revision 2.4 and modify it.  Programmer A
  804. checks  in  a  revision before programmer B.  Unfortunately,
  805. programmer B has not seen A's changes, so the effect is that
  806. A's  changes are covered up by B's deposit.  A's changes are
  807. not lost since all revisions are saved, but  they  are  con-
  808. fined to a single revision.
  809. _________________________
  810.    Note that this problem is entirely  different  from
  811. the atomicity problem.  Atomicity means that concurrent
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.                            - 16 -
  820.  
  821.      This conflict is prevented in RCS by locking.  Whenever
  822. someone intends to edit a revision (as opposed to reading or
  823. compiling it),  the  revision  should  be  checked  out  and
  824. locked,  using the -l option on co.  On subsequent check-in,
  825. ci tests the lock and then removes it.  At most one program-
  826. mer  at a time may lock a particular revision, and only this
  827. programmer may check  in  the  succeeding  revision.   Thus,
  828. while a revision is locked, it is the exclusive responsibil-
  829. ity of the locker.
  830.  
  831.      An important maxim for software tools like RCS is  that
  832. they  must  not  stand  in the way of making progress with a
  833. project.  This consideration leads to several weakenings  of
  834. the  locking mechanism.  First of all, even if a revision is
  835. locked, it can still be checked out.  This is  necessary  if
  836. other  people wish to compile or inspect the locked revision
  837. while the next one is in preparation.  The  only  operations
  838. they  cannot  do are to lock the revision or to check in the
  839. succeeding one.   Secondly,  check-in  operations  on  other
  840. branches  in the RCS file are still possible; the locking of
  841. one revision does not affect any other  revision.   Thirdly,
  842. revisions  are occasionally locked for a long period of time
  843. because a programmer is absent or otherwise unable  to  com-
  844. plete  the  assignment.  If another programmer has to make a
  845. pressing change, there are the following three  alternatives
  846. for making progress: a) find out who is holding the lock and
  847. ask that person to release it; b) check out the locked revi-
  848. sion,  modify  it,  check  it  in on a branch, and merge the
  849. changes later; c) break the lock.  Breaking a lock leaves  a
  850. highly visible trace, namely an electronic mail message that
  851. is sent automatically to the holder of the  lock,  recording
  852. the  breaker  and  a  commentary  requested from him.  Thus,
  853. _________________________
  854. update operations on the same RCS file cannot  be  per-
  855. mitted,  because  that may result in inconsistent data.
  856. Atomic updates are essential (and implemented in  RCS),
  857. but do not solve the conflict discussed here.
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.                            - 17 -
  868.  
  869. breaking locks is tolerated under certain circumstances, but
  870. will  not  go  unnoticed.   Experience  has  shown  that the
  871. automatic mail message attaches a high enough stigma to lock
  872. breaking,  such  that  programmers  break locks only in real
  873. emergencies, or when a co-worker resigns and  leaves  locked
  874. revisions behind.
  875.  
  876.      If an RCS file is private, i.e., when a programmer owns
  877. an  RCS  file  and  does  not  expect anyone else to perform
  878. check-in operations, locking is an unnecessary nuisance.  In
  879. this  case,  the  `strict locking feature' discussed earlier
  880. may be disabled, provided that file protection is  set  such
  881. that  only  the  owner may write the RCS file.  This has the
  882. effect that only the owner can check-in revisions, and  that
  883. no lock is needed for doing so.
  884.  
  885.      As added protection, each RCS file contains  an  access
  886. list  that specifies the users who may execute update opera-
  887. tions.  If an access list is empty, only  normal  UNIX  file
  888. protection  applies.   Thus,  the  access list is useful for
  889. restricting the set  of  people  who  would  otherwise  have
  890. update  permission.   Just  as with locking, the access list
  891. has no effect on read-only  operations  such  as  co.   This
  892. approach is consistent with the UNIX philosophy of openness,
  893. which  contributes  to  a  productive  software  development
  894. environment.
  895.  
  896. 5.  Configuration Management
  897.  
  898.      The preceding sections described  how  RCS  deals  with
  899. revisions  of  individual components; this section discusses
  900. how to handle configurations.  A configuration is a  set  of
  901. revisions,  where each revision comes from a different revi-
  902. sion group, and the revisions are selected  according  to  a
  903. certain  criterion.   For example, in order to build a func-
  904. tioning compiler, the `right' revisions  from  the  scanner,
  905. the  parser,  the  optimizer  and the code generator must be
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.                            - 18 -
  915.  
  916. combined.  RCS, in conjunction with MAKE, provides a  number
  917. of facilities to effect a smooth selection.
  918.  
  919. 5.1.  RCS Selection Functions
  920.  
  921.  
  922. Default selection
  923.      During development, the usual selection criterion is to
  924.      choose  the  latest revision of all components.  The co
  925.      command makes this selection by default.  For  example,
  926.      the command
  927.  
  928.              co  *,v
  929.  
  930.      retrieves the latest revision on the default branch  of
  931.      each  RCS  file  in the current directory.  The default
  932.      branch is usually the trunk, but may be  set  to  be  a
  933.      side  branch.   Side branches as defaults are needed in
  934.      distributed software development, as discussed  in  the
  935.      section on the RCS revision tree.
  936.  
  937.  
  938. Release based selection
  939.      Specifying a  release  or  branch  number  selects  the
  940.      latest   revision  in  that  release  or  branch.   For
  941.      instance,
  942.  
  943.              co  -r2  *,v
  944.  
  945.      retrieves the latest revision  with  release  number  2
  946.      from  each RCS file.  This selection is convenient if a
  947.      release has been completed and development has moved on
  948.      to the next release.
  949.  
  950.  
  951. State and author based selection
  952.      If the highest level  number  within  a  given  release
  953.      number  is not the desired one, the state attribute can
  954.      help.  For example,
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.                            - 19 -
  965.  
  966.  
  967.  
  968.              co  -r2  -sReleased  *,v
  969.  
  970.      retrieves the latest revision  with  release  number  2
  971.      whose  state  attribute  is `Released'.  Of course, the
  972.      state attribute has to be set appropriately, using  the
  973.      ci or rcs commands.  Another alternative is to select a
  974.      revision by its author, using the -w option.
  975.  
  976.  
  977. Date based selection
  978.      Revisions may also be  selected  by  date.   Suppose  a
  979.      release  of  an entire system was completed and current
  980.      on March 4, at 1:00 p.m. local time.  Then the command
  981.  
  982.              co  -d'March 4, 1:00 pm LT'  *,v
  983.  
  984.      checks out all the components of that release, indepen-
  985.      dent of the numbering.  The -d option specifies a `cut-
  986.      off date', i.e., the revision selected has  a  check-in
  987.      date that is closest to, but not after the date given.
  988.  
  989. Name based selection
  990.      The  most  powerful  selection  function  is  based  on
  991.      assigning symbolic names to revisions and branches.  In
  992.      large systems, a single release number or date  is  not
  993.      sufficient  to  collect  the appropriate revisions from
  994.      all groups.  For example, suppose one wishes to combine
  995.      release  2  of one subsystem and release 15 of another.
  996.      Most likely,  the  creation  dates  of  those  releases
  997.      differ  also.   Thus,  a single revision number or date
  998.      passed to the co command will not suffice to select the
  999.      right  revisions.  Symbolic revision numbers solve this
  1000.      problem.  Each RCS file may contain a set  of  symbolic
  1001.      names that are mapped to numeric revision numbers.  For
  1002.      example, assume the  symbol  V3  is  bound  to  release
  1003.      number  2  in  file s,v, and to revision number 15.9 in
  1004.      t,v.  Then the single command
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.                            - 20 -
  1016.  
  1017.  
  1018.  
  1019.              co  -rV3  s,v  t,v
  1020.  
  1021.      retrieves the latest revision of release  2  from  s,v,
  1022.      and  revision  15.9  from  t,v.  In a large system with
  1023.      many modules, checking out all revisions with one  com-
  1024.      mand greatly simplifies configuration management.
  1025.  
  1026.      Judicious use of symbolic revision numbers  helps  with
  1027. organizing   large   configurations.    A  special  command,
  1028. rcsfreeze, assigns a symbolic revision number to a  selected
  1029. revision in every RCS file.  Rcsfreeze effectively freezes a
  1030. configuration.   The  assigned  symbolic   revision   number
  1031. selects  all components of the configuration.  If necessary,
  1032. symbolic numbers may even be intermixed with  numeric  ones.
  1033. Thus, V3.5 in the above example would select revision 2.5 in
  1034. s,v and branch 15.9.5 in t,v.
  1035.  
  1036.      The options -r, -s, -w and -d may be  combined.   If  a
  1037. branch is given, the latest revision on that branch satisfy-
  1038. ing all conditions  is  retrieved;  otherwise,  the  default
  1039. branch is used.
  1040.  
  1041. 5.2.  Combining MAKE and RCS
  1042.  
  1043.      MAKE1 is a program that processes  configurations.   It
  1044. is driven by configuration specifications recorded in a spe-
  1045. cial file, called a `Makefile'.  MAKE avoids redundant  pro-
  1046. cessing steps by comparing creation dates of source and pro-
  1047. cessed objects.  For example, when instructed to compile all
  1048. modules  of  a given system, it only recompiles those source
  1049. modules that were changed since they were processed last.
  1050.  
  1051.      MAKE has been extended with  an  auto-checkout  feature
  1052. for RCS.* When  a  certain  file  to  be  processed  is  not
  1053. _________________________
  1054.   * This auto-checkout extension is available  only  in
  1055. some versions of MAKE, e.g. GNU MAKE.
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.                            - 21 -
  1066.  
  1067. present, MAKE attempts a check-out operation.   If  success-
  1068. ful, MAKE performs the required processing, and then deletes
  1069. the checked out  file  to  conserve  space.   The  selection
  1070. parameters  discussed  above can be passed to MAKE either as
  1071. parameters, or directly embedded in the Makefile.  MAKE  has
  1072. also  been extended to search the subdirectory named RCS for
  1073. needed files, rather than just the  current  working  direc-
  1074. tory.   However,  if a working file is present, MAKE totally
  1075. ignores the corresponding RCS  file  and  uses  the  working
  1076. file.   (In  newer  versions of MAKE distributed by AT&T and
  1077. others, auto-checkout can be achieved with the rule DEFAULT,
  1078. instead  of  a  special  extension of MAKE.  However, a file
  1079. checked out by the rule DEFAULT will not  be  deleted  after
  1080. processing. Rcsclean can be used for that purpose.)
  1081.  
  1082.      With auto-checkout, RCS/MAKE  can  effect  a  selection
  1083. rule  especially tuned for multi-person software development
  1084. and maintenance.  In these  situations,  programmers  should
  1085. obtain  configurations  that  consist  of the revisions they
  1086. have personally checked out plus the latest checked in revi-
  1087. sion  of  all other revision groups.  This schema can be set
  1088. up as follows.
  1089.  
  1090.      Each programmer chooses a working directory and  places
  1091. into  it  a  symbolic link, named RCS, to the directory con-
  1092. taining the relevant RCS files.   The  symbolic  link  makes
  1093. sure that co and ci operations need only specify the working
  1094. files, and that the Makefile need not be changed.  The  pro-
  1095. grammer  then checks out the needed files and modifies them.
  1096. If MAKE is invoked, it composes configurations by  selecting
  1097. those  revisions that are checked out, and the rest from the
  1098. subdirectory RCS.  The latter selection may be controlled by
  1099. a  symbolic  revision  number  or any of the other selection
  1100. criteria.  If  there  are  several  programmers  editing  in
  1101. separate  working  directories, they are insulated from each
  1102. other's changes until checking in their modifications.
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.                            - 22 -
  1113.  
  1114.      Similarly, a maintainer can recreate  an  older  confi-
  1115. guration  by starting to work in an empty working directory.
  1116. During  the  initial  MAKE  invocation,  all  revisions  are
  1117. selected from RCS files.  As the maintainer checks out files
  1118. and modifies them, a new configuration  is  gradually  built
  1119. up.  Every time MAKE is invoked, it substitutes the modified
  1120. revisions into the configuration being manipulated.
  1121.  
  1122.      A final application of RCS is to  use  it  for  storing
  1123. Makefiles.   Revision groups of Makefiles represent multiple
  1124. versions of configurations.   Whenever  a  configuration  is
  1125. baselined  or distributed, the best approach is to unambigu-
  1126. ously fix the configuration with a symbolic revision  number
  1127. by   calling  rcsfreeze,  to  embed  that  symbol  into  the
  1128. Makefile, and to check in the Makefile (using the same  sym-
  1129. bolic  revision number).  With this approach, old configura-
  1130. tions can be regenerated easily and reliably.
  1131.  
  1132. 6.  Usage Statistics
  1133.  
  1134.      The following usage statistics were  collected  on  two
  1135. DEC  VAX-11/780  computers  of  the  Purdue Computer Science
  1136. Department.  Both machines are mainly used for research pur-
  1137. poses.   Thus,  the data reflect an environment in which the
  1138. majority  of  projects  involve  prototyping  and   advanced
  1139. software   development,   but  relatively  little  long-term
  1140. maintenance.
  1141.  
  1142.      For the first experiment, the ci and co operations were
  1143. instrumented  to log the number of backward and forward del-
  1144. tas applied.  The data were  collected  during  a  13  month
  1145. period  from Dec. 1982 to Dec. 1983.  Table I summarizes the
  1146. results.
  1147.  
  1148. ___________________________________________________________________________________
  1149.  Operation      Total      Total deltas   Mean deltas    Operations       Branch
  1150.              operations      applied        applied     with >1 delta   operations
  1151. ___________________________________________________________________________________
  1152.  co              7867          9320          1.18        509     (6%)   203   (3%)
  1153.  ci              3468          2207          0.64         85     (2%)    75   (2%)
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162.  
  1163.                            - 23 -
  1164.  
  1165.  
  1166.  ci & co        11335         11527          1.02        594     (5%)   278   (2%)
  1167. ___________________________________________________________________________________
  1168. |
  1169.           |
  1170.                         |
  1171.                                        |
  1172.                                                      |
  1173.                                                                      |
  1174.                                                                                   |
  1175.  
  1176.        Table I.  Statistics for co and ci operations.
  1177.  
  1178.      The first two lines show statistics for  check-out  and
  1179. check-in; the third line shows the combination.  Recall that
  1180. ci performs an implicit check-out to obtain a  revision  for
  1181. computing  the  delta.   In all measures presented, the most
  1182. recent revision (stored intact) counts as  one  delta.   The
  1183. number  of  deltas  applied  represents the number of passes
  1184. necessary, where the first `pass' is a copying step.
  1185.  
  1186.      Note that the check-out operation is executed more than
  1187. twice  as  frequently as the check-in operation.  The fourth
  1188. column gives the mean number of deltas applied in all  three
  1189. cases.   For  ci,  the mean number of deltas applied is less
  1190. than  one.   The  reasons  are  that  the  initial  check-in
  1191. requires no delta at all, and that the only time ci requires
  1192. more than one delta is for branches.   Column  5  shows  the
  1193. actual  number  of  operations  that  applied  more than one
  1194. delta.  The last column indicates  that  branches  were  not
  1195. used often.
  1196.  
  1197.      The last three columns demonstrate that the most recent
  1198. trunk  revision is by far the most frequently accessed.  For
  1199. RCS, check-out of this revision is a simple copy  operation,
  1200. which  is  the  absolute minimum given the copy-semantics of
  1201. co.  Access to older revisions and branches is  more  common
  1202. in  non-academic  environments,  yet even if access to older
  1203. deltas were an order of magnitude more  frequent,  the  com-
  1204. bined  average number of deltas applied would still be below
  1205. 1.2.  Since RCS is faster than SCCS until  up  to  10  delta
  1206. applications,  reverse  deltas  are  clearly  the  method of
  1207. choice.
  1208.  
  1209.      The second experiment,  conducted  in  March  of  1984,
  1210. involved  surveying  the  existing  RCS  files  on  our  two
  1211. machines.  The goal was to  determine  the  mean  number  of
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.                            - 24 -
  1221.  
  1222. revisions  per  RCS  file,  as well as the space consumed by
  1223. them.  Table II shows the results.  (Tables I  and  II  were
  1224. produced at different times and are unrelated.)
  1225.  
  1226. _________________________________________________________________________________________
  1227.               Total RCS     Total       Mean      Mean size of   Mean size of   Overhead
  1228.                 files     revisions   revisions    RCS files      revisions
  1229. _________________________________________________________________________________________
  1230.  All files      8033        11133       1.39          6156           5585         1.10
  1231.  Files with     1477         4578       3.10          8074           6041         1.34
  1232.  >_ 2 deltas
  1233. _________________________________________________________________________________________
  1234. ||||||
  1235.  
  1236.  
  1237.  
  1238.  
  1239.            ||||||
  1240.  
  1241.  
  1242.  
  1243.  
  1244.                        ||||||
  1245.  
  1246.  
  1247.  
  1248.  
  1249.                                    ||||||
  1250.  
  1251.  
  1252.  
  1253.  
  1254.                                                ||||||
  1255.  
  1256.  
  1257.  
  1258.  
  1259.                                                               ||||||
  1260.  
  1261.  
  1262.  
  1263.  
  1264.                                                                              ||||||
  1265.  
  1266.  
  1267.  
  1268.  
  1269.                                                                                         ||||||
  1270.  
  1271.  
  1272.  
  1273.  
  1274.  
  1275.  
  1276.             Table II.  Statistics for RCS files.
  1277.  
  1278.      The mean number of revisions  per  RCS  file  is  1.39.
  1279. Columns  5  and  6  show the mean sizes (in bytes) of an RCS
  1280. file and of the latest revision of each  RCS  file,  respec-
  1281. tively.   The  `overhead'  column  contains the ratio of the
  1282. mean sizes.  Assuming that all revisions in an RCS file  are
  1283. approximately  the  same size, this ratio gives a measure of
  1284. the space consumed by the extra revisions.
  1285.  
  1286.      In our sample, over 80 per cent of the RCS  files  con-
  1287. tained  only a single revision.  The reason is that our sys-
  1288. tems programmers routinely check in all source files on  the
  1289. distribution  tapes,  even  though they may never touch them
  1290. again.  To get a better indication of how much space savings
  1291. are possible with deltas, all measures with those files that
  1292. contained 2 or more revisions  were  recomputed.   Only  for
  1293. those  files is RCS necessary.  As shown in the second line,
  1294. the average number of revisions for  those  files  is  3.10,
  1295. with  an  overhead  of 1.34.  This means that the extra 2.10
  1296. deltas require 34 per cent extra space, or 16 per  cent  per
  1297. extra  revision.   Rochkind3  measured the space consumed by
  1298. SCCS, and reported an average of 5 revisions per  group  and
  1299. an  overhead  of  1.37  (or about 9 per cent per extra revi-
  1300. sion).  In a later paper, Glasser6 observed an average of  7
  1301. revisions per group in a single, large project, but provided
  1302. no overhead figure.  In his paper on DSEE5, Leblang reported
  1303. that  delta  storage combined with blank compression results
  1304. in an overhead of a mere 1-2 per cent per  revision.   Since
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.                            - 25 -
  1313.  
  1314. leading  blanks  accounted for about 20 per cent of the sur-
  1315. veyed Pascal programs, a revision group  with  5-10  members
  1316. was smaller than a single cleartext copy.
  1317.  
  1318.      The above observations  demonstrate  clearly  that  the
  1319. space  needed  for  extra  revisions  is  small.  With delta
  1320. storage, the luxury of keeping multiple revisions online  is
  1321. certainly  affordable.   In  fact, introducing a system with
  1322. delta storage may reduce storage requirements, because  pro-
  1323. grammers  often  save  back-up copies anyway.  Since back-up
  1324. copies are stored much more efficiently with deltas,  intro-
  1325. ducing a system such as RCS may actually free a considerable
  1326. amount of space.
  1327.  
  1328. 7.  Survey of Version Control Tools
  1329.  
  1330.      The need to keep back-up copies of software arose  when
  1331. programs  and data were no longer stored on paper media, but
  1332. were entered from terminals and  stored  on  disk.   Back-up
  1333. copies  are  desirable for reliability, and many modern edi-
  1334. tors automatically  save  a  back-up  copy  for  every  file
  1335. touched.  This strategy is valuable for short-term back-ups,
  1336. but not suitable for long-term  version  control,  since  an
  1337. existing   back-up   copy   is   overwritten   whenever  the
  1338. corresponding file is edited.
  1339.  
  1340.      Tape  archives  are  suitable  for  long-term,  offline
  1341. storage.   If all changed files are dumped on a back-up tape
  1342. once per day, old  revisions  remain  accessible.   However,
  1343. tape  archives  are  unsatisfactory  for  version control in
  1344. several ways.  First, backing up the file  system  every  24
  1345. hours  does  not  capture intermediate revisions.  Secondly,
  1346. the old revisions are not  online,  and  accessing  them  is
  1347. tedious  and time-consuming.  In particular, it is impracti-
  1348. cal to compare several old revisions  of  a  group,  because
  1349. that may require mounting and searching several tapes.  Tape
  1350. archives are important  fail-safe  tools  in  the  event  of
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.                            - 26 -
  1360.  
  1361. catastrophic disk failures or accidental deletions, but they
  1362. are ill-suited for  version  control.   Conversely,  version
  1363. control tools do not obviate the need for tape archives.
  1364.  
  1365.      A natural technique for keeping several  old  revisions
  1366. online  is  to  never  delete a file.  Editing a file simply
  1367. creates a new file with the same name, but with a  different
  1368. sequence  number.  This technique, available as an option in
  1369. DEC's VMS operating system, turns out to be  inadequate  for
  1370. version  control.   First,  it is prohibitively expensive in
  1371. terms of storage costs, especially since no data compression
  1372. techniques are employed.  Secondly, indiscriminately storing
  1373. every change produces too many  revisions,  and  programmers
  1374. have difficulties distinguishing them.  The proliferation of
  1375. revisions forces programmers to spend much time  on  finding
  1376. and  deleting  useless  files.  Thirdly, most of the support
  1377. functions like locking,  logging,  revision  selection,  and
  1378. identification described in this paper are not available.
  1379.  
  1380.      An alternative approach is  to  separate  editing  from
  1381. revision  control.   The  user  may  repeatedly edit a given
  1382. revision, until freezing it with an explicit command.   Once
  1383. a  revision  is  frozen, it is stored permanently and can no
  1384. longer be modified.  (In RCS, freezing a revisions  is  done
  1385. with ci.) Editing a frozen revision implicitly creates a new
  1386. one, which can again  be  changed  repeatedly  until  it  is
  1387. frozen  itself.  This approach saves exactly those revisions
  1388. that the user considers important, and keeps the  number  of
  1389. revisions  manageable.   IBM's  CLEAR/CASTER7, AT&T's SCCS3,
  1390. CMU's SDC8 and DEC's CMS9, are examples of  version  control
  1391. systems  using this approach.  CLEAR/CASTER maintains a data
  1392. base of programs,  specifications,  documentation  and  mes-
  1393. sages,  using  deltas.   Its goal is to provide control over
  1394. the development process from a management  viewpoint.   SCCS
  1395. stores  multiple  revisions  of  source text in an ancestral
  1396. tree, records a log entry for each revision, provides access
  1397. control,  and  has  facilities for uniquely identifying each
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.                            - 27 -
  1406.  
  1407. revision.  An efficient delta technique  reduces  the  space
  1408. consumed  by  each revision group.  SDC is much simpler than
  1409. SCCS because it stores not more than  two  revisions.   How-
  1410. ever,  it  maintains  a  complete log for all old revisions,
  1411. some of which may be  on  back-up  tape.   CMS,  like  SCCS,
  1412. manages tree-structured revision groups, but offers no iden-
  1413. tification mechanism.
  1414.  
  1415.      Tools for dealing with configurations are  still  in  a
  1416. state  of flux.  SCCS, SDC and CMS can be combined with MAKE
  1417. or MAKE-like programs.  Since flexible selection  rules  are
  1418. missing  from  all these tools, it is sometimes difficult to
  1419. specify precisely which revision of  each  group  should  be
  1420. passed  to  MAKE  for building a desired configuration.  The
  1421. Xerox Cedar system10 provides a `System Modeller'  that  can
  1422. rebuild  a  configuration  from  an  arbitrary set of module
  1423. revisions.  The revisions of a module are only distinguished
  1424. by  creation time, and there is no tool for managing groups.
  1425. Since the selection rules are primitive, the System Modeller
  1426. appears  to be somewhat tedious to use.  Apollo's DSEE5 is a
  1427. sophisticated software engineering environment.  It  manages
  1428. revision  groups  in  a way similar to SCCS and CMS.  Confi-
  1429. gurations are built using `configuration threads'.  A confi-
  1430. guration thread states which revision of each group named in
  1431. a configuration should be chosen.   A  configuration  thread
  1432. may  contain dynamic specifiers (e.g., `choose the revisions
  1433. I am currently working on, and  the  most  recent  revisions
  1434. otherwise'),  which  are  bound automatically at build time.
  1435. It also provides a notification mechanism for alerting main-
  1436. tainers about the need to rebuild a system after a change.
  1437.  
  1438.      RCS is based on a general model for  describing  multi-
  1439. version/multi-configuration  systems11.  The model describes
  1440. systems using AND/OR graphs, where AND nodes represent  con-
  1441. figurations,  and  OR  nodes  represent version groups.  The
  1442. model gives rise to a suit of selection rules for  composing
  1443. configurations,  almost all of which are implemented in RCS.
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.                            - 28 -
  1452.  
  1453. The revisions selected by RCS are passed to MAKE for  confi-
  1454. guration  building.   Revision  group management is modelled
  1455. after SCCS.  RCS retains SCCS's best features, but offers  a
  1456. significantly  simpler  user  interface,  flexible selection
  1457. rules, adequate integration with MAKE and improved identifi-
  1458. cation.   A  detailed  comparison of RCS and SCCS appears in
  1459. Reference 4.
  1460.  
  1461.      An important component of all revision control  systems
  1462. is  a  program  for  computing deltas.  SCCS and RCS use the
  1463. program diff2, which first computes the longest common  sub-
  1464. string  of  two  revisions, and then produces the delta from
  1465. that substring.  The delta is simply an edit script consist-
  1466. ing  of  deletion  and  insertion commands that generate one
  1467. revision from the other.
  1468.  
  1469.      A delta based on a  longest  common  substring  is  not
  1470. necessarily  minimal,  because it does not take advantage of
  1471. crossing block moves.  Crossing block moves arise if two  or
  1472. more  blocks  of  lines  (e.g., procedures) appear in a dif-
  1473. ferent order in two revisions.  An edit script derived  from
  1474. a  longest common substring first deletes the shorter of the
  1475. two blocks, and then reinserts  it.   Heckel12  proposed  an
  1476. algorithm for detecting block moves, but since the algorithm
  1477. is based on heuristics, there are conditions under which the
  1478. generated  delta  is far from minimal.  DSEE uses this algo-
  1479. rithm  combined  with  blank  compression,  apparently  with
  1480. satisfactory  overall  results.   A  new  algorithm  that is
  1481. guaranteed to produce a minimal delta based on  block  moves
  1482. appears  in  Reference 13.  A future release of RCS will use
  1483. this algorithm.
  1484.  
  1485.      Acknowledgements: Many people have helped  make  RCS  a
  1486. success by contributed criticisms, suggestions, corrections,
  1487. and even whole new commands (including manual  pages).   The
  1488. list  of  people  is  too long to be reproduced here, but my
  1489. sincere thanks for their help and goodwill goes  to  all  of
  1490.  
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496.  
  1497.  
  1498.                            - 29 -
  1499.  
  1500. them.
  1501.  
  1502.  
  1503. Appendix: Synopsis of RCS Operations
  1504.  
  1505.  
  1506. ci - check in revisions
  1507.      Ci stores the contents  of  a  working  file  into  the
  1508.      corresponding  RCS  file as a new revision.  If the RCS
  1509.      file doesn't exist, ci  creates  it.   Ci  removes  the
  1510.      working  file,  unless  one  of the options -u or -l is
  1511.      present.  For each check-in, ci asks for  a  commentary
  1512.      describing  the  changes relative to the previous revi-
  1513.      sion.
  1514.  
  1515.      Ci assigns the revision number given by the -r  option;
  1516.      if  that  option is missing, it derives the number from
  1517.      the lock held by the user; if  there  is  no  lock  and
  1518.      locking  is not strict, ci increments the number of the
  1519.      latest revision on the trunk.  A side branch  can  only
  1520.      be started by explicitly specifying its number with the
  1521.      -r option during check-in.
  1522.  
  1523.      Ci also determines whether the revision to  be  checked
  1524.      in is different from the previous one, and asks whether
  1525.      to proceed if not.  This facility  simplifies  check-in
  1526.      operations  for  large  systems,  because  one need not
  1527.      remember which files were changed.
  1528.  
  1529.      The option -k searches the checked in file for identif-
  1530.      ication  markers  containing  the  attributes  revision
  1531.      number, check-in date, author and  state,  and  assigns
  1532.      these  to  the new revision rather than computing them.
  1533.      This option is useful for software distribution:  Reci-
  1534.      pients  of  distributed software using RCS should check
  1535.      in updates with the -k option.  This convention guaran-
  1536.      tees  that  revision numbers, check-in dates, etc., are
  1537.      the same at all sites.
  1538.  
  1539. co - check out revisions
  1540.      Co retrieves revisions according  to  revision  number,
  1541.      date,  author  and  state attributes.  It either places
  1542.      the revision into the working file, or prints it on the
  1543.      standard  output.  Co always expands the identification
  1544.      markers.
  1545.  
  1546. ident - extract identification markers
  1547.      Ident extracts the identification markers  expanded  by
  1548.      co from any file and prints them.
  1549.  
  1550. rcs - change RCS file attributes
  1551.      Rcs is an administrative operation that changes  access
  1552.      lists,   locks,  unlocks,  breaks  locks,  toggles  the
  1553.  
  1554.  
  1555.  
  1556.  
  1557.  
  1558.  
  1559.  
  1560.  
  1561.  
  1562.                            - 30 -
  1563.  
  1564.  
  1565.      strict-locking feature, sets state attributes and  sym-
  1566.      bolic  revision  numbers,  changes the description, and
  1567.      deletes revisions.  A revision can only be  deleted  if
  1568.      it is not the fork of a side branch.
  1569.  
  1570. rcsclean - clean working directory
  1571.      Rcsclean removes working files that  were  checked  out
  1572.      but never changed.*
  1573.  
  1574. rcsdiff - compare revisions
  1575.      Rcsdiff compares two revisions and prints their differ-
  1576.      ence,  using  the UNIX tool diff.  One of the revisions
  1577.      compared may be checked out.  This  command  is  useful
  1578.      for finding out about changes.
  1579.  
  1580. rcsfreeze - freeze a configuration
  1581.      Rcsfreeze assigns the same symbolic revision number  to
  1582.      a  given  revision  in  all RCS files.  This command is
  1583.      useful for accurately recording a configuration.*
  1584.  
  1585. rcsmerge - merge revisions
  1586.      Rcsmerge merges two  revisions,  rev1  and  rev2,  with
  1587.      respect  to a common ancestor.  A 3-way file comparison
  1588.      determines the segments of lines that are (a) the  same
  1589.      in all three revisions, or (b) the same in 2 revisions,
  1590.      or (c) different in all three.   For  all  segments  of
  1591.      type (b) where rev1 is the differing revision, the seg-
  1592.      ment in rev1  replaces  the  corresponding  segment  of
  1593.      rev2.   Type  (c)  indicates  an overlapping change, is
  1594.      flagged as an error, and requires user intervention  to
  1595.      select the correct alternative.
  1596.  
  1597. rlog - read log messages
  1598.      Rlog prints the log messages and other  information  in
  1599.      an RCS file.
  1600.  
  1601.  
  1602.  
  1603.  
  1604.  
  1605.  
  1606.  
  1607.  
  1608.  
  1609.  
  1610.  
  1611.  
  1612.  
  1613.  
  1614. _________________________
  1615.   * The rcsclean and rcsfreeze  commands  are  optional
  1616. and are not always installed.
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.                            - 31 -
  1628.  
  1629.  
  1630. References
  1631.  
  1632.  
  1633. 1.   Feldman, Stuart I., "Make--A  Program  for  Maintaining
  1634.      Computer  Programs,"  Software--Practice  & Experience,
  1635.      vol. 9, no. 3, pp. 255-265, March 1979.
  1636.  
  1637. 2.   Hunt, James W. and McIlroy, M. D.,  "An  Algorithm  for
  1638.      Differential  File  Comparison,"  41, Computing Science
  1639.      Technical Report, Bell Laboratories, June 1976.
  1640.  
  1641. 3.   Rochkind, Marc J., "The Source  Code  Control  System,"
  1642.      IEEE  Transactions  on Software Engineering, vol. SE-1,
  1643.      no. 4, pp. 364-370, Dec. 1975.
  1644.  
  1645. 4.   Tichy, Walter F., "Design, Implementation, and  Evalua-
  1646.      tion  of  a Revision Control System," in Proceedings of
  1647.      the 6th International Conference on Software  Engineer-
  1648.      ing, pp. 58-67, ACM, IEEE, IPS, NBS, September 1982.
  1649.  
  1650. 5.   Leblang, David B. and Chase, Robert P., "Computer-Aided
  1651.      Software   Engineering  in  a  Distributed  Workstation
  1652.      Environment," SIGPLAN Notices,  vol.  19,  no.  5,  pp.
  1653.      104-112,    May   1984.    Proceedings   of   the   ACM
  1654.      SIGSOFT/SIGPLAN Software Engineering Symposium on Prac-
  1655.      tical Software Development Environments.
  1656.  
  1657. 6.   Glasser, Alan L., "The Evolution of a Source Code  Con-
  1658.      trol  System,"  Software Engineering Notes, vol. 3, no.
  1659.      5, pp. 122-125, Nov. 1978.  Proceedings of the Software
  1660.      Quality and Assurance Workshop.
  1661.  
  1662. 7.   Brown, H.B., "The Clear/Caster System," Nato Conference
  1663.      on Software Engineering, Rome, 1970.
  1664.  
  1665. 8.   Habermann, A. Nico, A Software Development Control Sys-
  1666.      tem,   Technical  Report,  Carnegie-Mellon  University,
  1667.      Department of Computer Science, Jan. 1979.
  1668.  
  1669. 9.   DEC, Code Management System, Digital Equipment Corpora-
  1670.      tion, 1982.  Document No. EA-23134-82
  1671.  
  1672. 10.  Lampson, Butler W. and Schmidt, Eric E., "Practical Use
  1673.      of  a Polymorphic Applicative Language," in Proceedings
  1674.      of the 10th  Symposium  on  Principles  of  Programming
  1675.      Languages, pp. 237-255, ACM, January 1983.
  1676.  
  1677. 11.  Tichy, Walter F., "A Data Model for Programming Support
  1678.      Environments  and  its Application," in Automated Tools
  1679.      for Information  System  Design  and  Development,  ed.
  1680.      Hans-Jochen  Schneider and Anthony I. Wasserman, North-
  1681.      Holland Publishing Company, Amsterdam, 1982.
  1682.  
  1683. 12.  Heckel, Paul, "A Technique  for  Isolating  Differences
  1684.  
  1685.  
  1686.  
  1687.  
  1688.  
  1689.  
  1690.  
  1691.  
  1692.  
  1693.                            - 32 -
  1694.  
  1695.  
  1696.      Between Files," Communications of the ACM, vol. 21, no.
  1697.      4, pp. 264-268, April 1978.
  1698.  
  1699. 13.  Tichy,  Walter  F.,  "The  String-to-String  Correction
  1700.      Problem with Block Moves," ACM Transactions on Computer
  1701.      Systems, vol. 2, no. 4, pp. 309-321, Nov. 1984.
  1702.  
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  
  1724.  
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.  
  1739.  
  1740.  
  1741.  
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.